#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <vector>

typedef void (*handler_t)();//函数指针类型
std::vector<handler_t>handlers;//函数指针数组

void func_one()
{
    printf("第一个工作函数\n");
}
void func_two()
{
    printf("第二个工作函数\n");
}
void load()
{
    handlers.push_back(func_one);
    handlers.push_back(func_two);
}
int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork:");
        return 1;
    }
    else if(id == 0)
    {
        //子进程
        int cnt = 5;
        while(cnt)
        {
            printf("cnt:%d , I am a child process: pid: %d, ppid: %d\n",cnt,getpid(), getppid());
            sleep(1);
            cnt--;
        }
        exit(0); 
    }
    else
    {
        //父进程 
        int quit = 0;
        while(!quit)
        {
            int status = 0;
            pid_t res = waitpid(-1,&status,WNOHANG);
            if(res > 0)
            {
                //等待成功并且子进程退出
                printf("等待成功，子进程退出，退出码: %d\n",WEXITSTATUS(status));
                quit = 1;
            }
            else if(res == 0)
            {
                //等待成功但是子进程没有退出，让我们等待
                printf("子进程还在运行中，还需要等待？？\n");
                if(handlers.empty()) load();
                for(auto iter : handlers)
                {
                    iter();
                }

            }
            else 
            {
                //等待失败
                printf("wait失败\n");
                quit = 1;
            }
            sleep(1);
        }
        //pid_t ret = wait(NULL);//阻塞式等待
    }

    return 10;
}
